home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / CodeWarrior Lite / Metrowerks C⁄C++ Lite / Libraries / Runtime / Runtime PPC / Sources / runtime.s < prev    next >
Encoding:
Text File  |  1995-02-23  |  6.1 KB  |  319 lines  |  [TEXT/MPS ]

  1. #    runtime.s    -    Runtime Support routines for Metrowerks C++ for PowerPC
  2. #
  3. #    Copyright © 1993 metrowerks inc.  All Rights Reserved.
  4. #
  5. #
  6. #    BUILD INSTRUCTIONS
  7. #
  8. #    To assemble this file:
  9. #
  10. #        ppcasm runtime.s -o runtime.o
  11. #
  12. #    The object file runtime.o can be added directly to any CodeWarrior™ project.
  13. #
  14.  
  15.         dialect    powerpc
  16.  
  17. #
  18. #    Assembler Equates
  19. #
  20. cr0        equ        0
  21. cr1        equ        1
  22. cr2        equ        2
  23. cr3        equ        3
  24. cr4        equ        4
  25. cr5        equ        5
  26. cr6        equ        6
  27. cr7        equ        7
  28.  
  29. #
  30. #    Private Data
  31. #
  32.         csect    __constants{RO}
  33.         dc.l    0x00000000            # 0.0
  34.         dc.l    0x00000000
  35.         dc.l    0x41F00000            # 2**32
  36.         dc.l    0x00000000
  37.         dc.l    0x41E00000            # 2**31
  38.         dc.l    0x00000000
  39.  
  40. #
  41. #    TOC pointers
  42. #
  43.         toc
  44.         tc        __constants{TC}, __constants{RO}
  45.  
  46.  
  47. #    __cvt_fp2unsigned    -    convert floating-point to 32-bit unsigned integer
  48. #
  49. #    Convert the floating-point value in F1 to a 32-bit unsigned integer
  50. #    and return the result in R3.
  51. #
  52. #    This routine is copied from the Motorola PowerPC 602 Users Manual, pg. F-1.
  53. #
  54. #    We provide the synonym ".__uitrunc" for compatibility with PPCC.
  55. #
  56.         csect    .__cvt_fp2unsigned{PR}
  57.         export    .__cvt_fp2unsigned{PR}
  58.         export    .__uitrunc
  59.         
  60. .__uitrunc:
  61.         lwz        r4,__constants{TC}(RTOC)
  62.         li        r3,0                # r3 = 0
  63.         lfd        fp0,0(r4)            # fp0 = 0.0
  64.         lfd        fp3,8(r4)            # fp3 = 2**32
  65.         lfd        fp4,16(r4)            # fp4 = 2**31
  66.         fcmpu    cr0,fp1,fp0            # cr0 = compare(fp1,0.0)
  67.         fcmpu    cr6,fp1,fp3            # cr6 = compare(fp1,2**32)
  68.         bltlr    cr0                    # return 0x00000000 if input was < 0.0
  69.         addi    r3,r3,-1
  70.         bgelr    cr6                    # return 0xFFFFFFFF if input was >= 2**32
  71.         fcmpu    cr7,fp1,fp4            # cr7 = compare(fp1,2**31)
  72.         fmr        fp2,fp1
  73.         blt        cr7,$+8                # use fp1 if < 2**31
  74.         fsub    fp2,fp1,fp4            # subtract 2**31
  75.         fctiwz    fp2,fp2                # convert float to 8-byte integer
  76.         stfd    fp2,-8(SP)            # store 8-byte integer
  77.         lwz        r3,-4(SP)            # load 4-byte integer
  78.         bltlr    cr7
  79.         addis    r3,r3,-32768        # add 2**31 if input was >= 2**31
  80.         blr
  81.  
  82.  
  83. #    __ptr_glue        -    glue for function calls through pointers
  84. #
  85. #    Call the function whose 2-word TVector address is in R12.
  86. #
  87.         csect    .__ptr_glue{GL}
  88.         export    .__ptr_glue{GL}
  89.         lwz        r0,0(r12)
  90.         stw        RTOC,20(SP)
  91.         mtctr    r0
  92.         lwz        RTOC,4(r12)
  93.         bctr
  94.         
  95.         
  96. #    _ptrgl12        -    PPCC-compatible version of __ptr_glue
  97. #
  98. #    Call the function whose 2-word TVector address is in R12.
  99. #
  100.         csect    ._ptrgl12{GL}
  101.         export    ._ptrgl12{GL}
  102.         lwz        r0,0(r12)
  103.         stw        RTOC,20(SP)
  104.         mtctr    r0
  105.         lwz        RTOC,4(r12)
  106.         bctr
  107.         
  108.         
  109. #    _ptrgl            -    PPCC-compatible version of __ptr_glue
  110. #
  111. #    Call the function whose 3-word TVector address is in R11. R12 must be
  112. #    set to point to the TVector on exit. The 3rd word of the TVector is ignored.
  113. #    (This is different from the AIX convention)
  114. #
  115.         csect    ._ptrgl{GL}
  116.         export    ._ptrgl{GL}
  117.         lwz        r0,0(r11)
  118.         stw        RTOC,20(SP)
  119.         mtctr    r0
  120.         lwz        RTOC,4(r11)
  121.         mr        r12,r11
  122.         bctr
  123.  
  124.  
  125. #
  126. #    __save_fpr_XX    -    save FPR's XX through 31
  127. #
  128.         csect    .__save_fpr{PR}
  129.         export    .__save_fpr{PR}
  130.         export    .__save_fpr_14
  131.         export    ._savef14
  132.         export    .__save_fpr_15
  133.         export    ._savef15
  134.         export    .__save_fpr_16
  135.         export    ._savef16
  136.         export    .__save_fpr_17
  137.         export    ._savef17
  138.         export    .__save_fpr_18
  139.         export    ._savef18
  140.         export    .__save_fpr_19
  141.         export    ._savef19
  142.         export    .__save_fpr_20
  143.         export    ._savef20
  144.         export    .__save_fpr_21
  145.         export    ._savef21
  146.         export    .__save_fpr_22
  147.         export    ._savef22
  148.         export    .__save_fpr_23
  149.         export    ._savef23
  150.         export    .__save_fpr_24
  151.         export    ._savef24
  152.         export    .__save_fpr_25
  153.         export    ._savef25
  154.         export    .__save_fpr_26
  155.         export    ._savef26
  156.         export    .__save_fpr_27
  157.         export    ._savef27
  158.         export    .__save_fpr_28
  159.         export    ._savef28
  160.         export    .__save_fpr_29
  161.         export    ._savef29
  162.         export    .__save_fpr_30
  163.         export    ._savef30
  164.         export    .__save_fpr_31
  165.         export    ._savef31
  166. .__save_fpr_14:
  167. ._savef14:
  168.         stfd    fp14,-144(SP)
  169. .__save_fpr_15:
  170. ._savef15:
  171.         stfd    fp15,-136(SP)
  172. .__save_fpr_16:
  173. ._savef16:
  174.         stfd    fp16,-128(SP)
  175. .__save_fpr_17:
  176. ._savef17:
  177.         stfd    fp17,-120(SP)
  178. .__save_fpr_18:
  179. ._savef18:
  180.         stfd    fp18,-112(SP)
  181. .__save_fpr_19:
  182. ._savef19:
  183.         stfd    fp19,-104(SP)
  184. .__save_fpr_20:
  185. ._savef20:
  186.         stfd    fp20,-96(SP)
  187. .__save_fpr_21:
  188. ._savef21:
  189.         stfd    fp21,-88(SP)
  190. .__save_fpr_22:
  191. ._savef22:
  192.         stfd    fp22,-80(SP)
  193. .__save_fpr_23:
  194. ._savef23:
  195.         stfd    fp23,-72(SP)
  196. .__save_fpr_24:
  197. ._savef24:
  198.         stfd    fp24,-64(SP)
  199. .__save_fpr_25:
  200. ._savef25:
  201.         stfd    fp25,-56(SP)
  202. .__save_fpr_26:
  203. ._savef26:
  204.         stfd    fp26,-48(SP)
  205. .__save_fpr_27:
  206. ._savef27:
  207.         stfd    fp27,-40(SP)
  208. .__save_fpr_28:
  209. ._savef28:
  210.         stfd    fp28,-32(SP)
  211. .__save_fpr_29:
  212. ._savef29:
  213.         stfd    fp29,-24(SP)
  214. .__save_fpr_30:
  215. ._savef30:
  216.         stfd    fp30,-16(SP)
  217. .__save_fpr_31:
  218. ._savef31:
  219.         stfd    fp31,-8(SP)
  220.         blr
  221.         
  222.  
  223. #
  224. #    __restore_fpr_XX    -    restore FPR's XX through 31
  225. #
  226.         csect    .__restore_fpr{PR}
  227.         export    .__restore_fpr{PR}
  228.         export    .__restore_fpr_14
  229.         export    ._restf14
  230.         export    .__restore_fpr_15
  231.         export    ._restf15
  232.         export    .__restore_fpr_16
  233.         export    ._restf16
  234.         export    .__restore_fpr_17
  235.         export    ._restf17
  236.         export    .__restore_fpr_18
  237.         export    ._restf18
  238.         export    .__restore_fpr_19
  239.         export    ._restf19
  240.         export    .__restore_fpr_20
  241.         export    ._restf20
  242.         export    .__restore_fpr_21
  243.         export    ._restf21
  244.         export    .__restore_fpr_22
  245.         export    ._restf22
  246.         export    .__restore_fpr_23
  247.         export    ._restf23
  248.         export    .__restore_fpr_24
  249.         export    ._restf24
  250.         export    .__restore_fpr_25
  251.         export    ._restf25
  252.         export    .__restore_fpr_26
  253.         export    ._restf26
  254.         export    .__restore_fpr_27
  255.         export    ._restf27
  256.         export    .__restore_fpr_28
  257.         export    ._restf28
  258.         export    .__restore_fpr_29
  259.         export    ._restf29
  260.         export    .__restore_fpr_30
  261.         export    ._restf30
  262.         export    .__restore_fpr_31
  263.         export    ._restf31
  264. .__restore_fpr_14:
  265. ._restf14:
  266.         lfd        fp14,-144(SP)
  267. .__restore_fpr_15:
  268. ._restf15:
  269.         lfd        fp15,-136(SP)
  270. .__restore_fpr_16:
  271. ._restf16:
  272.         lfd        fp16,-128(SP)
  273. .__restore_fpr_17:
  274. ._restf17:
  275.         lfd        fp17,-120(SP)
  276. .__restore_fpr_18:
  277. ._restf18:
  278.         lfd        fp18,-112(SP)
  279. .__restore_fpr_19:
  280. ._restf19:
  281.         lfd        fp19,-104(SP)
  282. .__restore_fpr_20:
  283. ._restf20:
  284.         lfd        fp20,-96(SP)
  285. .__restore_fpr_21:
  286. ._restf21:
  287.         lfd        fp21,-88(SP)
  288. .__restore_fpr_22:
  289. ._restf22:
  290.         lfd        fp22,-80(SP)
  291. .__restore_fpr_23:
  292. ._restf23:
  293.         lfd        fp23,-72(SP)
  294. .__restore_fpr_24:
  295. ._restf24:
  296.         lfd        fp24,-64(SP)
  297. .__restore_fpr_25:
  298. ._restf25:
  299.         lfd        fp25,-56(SP)
  300. .__restore_fpr_26:
  301. ._restf26:
  302.         lfd        fp26,-48(SP)
  303. .__restore_fpr_27:
  304. ._restf27:
  305.         lfd        fp27,-40(SP)
  306. .__restore_fpr_28:
  307. ._restf28:
  308.         lfd        fp28,-32(SP)
  309. .__restore_fpr_29:
  310. ._restf29:
  311.         lfd        fp29,-24(SP)
  312. .__restore_fpr_30:
  313. ._restf30:
  314.         lfd        fp30,-16(SP)
  315. .__restore_fpr_31:
  316. ._restf31:
  317.         lfd        fp31,-8(SP)
  318.         blr
  319.